//index.js
//获取应用实例
const app = getApp()

Page({
    data: {
        userInfo: {},
        hasUserInfo: false,
        canIUse: wx.canIUse('button.open-type.getUserInfo'),
        game: {},
        gameOver: false,
        lastX: 0,
        lastY: 0,
        currentGesture: 0,
    },
    //事件处理函数
    bindViewTap: function () {
        wx.navigateTo({
            url: '../logs/logs'
        })
    },
    onLoad: function () {
        if (app.globalData.userInfo) {
            this.setData({
                userInfo: app.globalData.userInfo,
                hasUserInfo: true
            })
        } else if (this.data.canIUse) {
            // 由于 getUserInfo 是网络请求，可能会在 Page.onLoad 之后才返回
            // 所以此处加入 callback 以防止这种情况
            app.userInfoReadyCallback = res => {
                this.setData({
                    userInfo: res.userInfo,
                    hasUserInfo: true
                })
            }
        } else {
            // 在没有 open-type=getUserInfo 版本的兼容处理
            wx.getUserInfo({
                success: res => {
                    app.globalData.userInfo = res.userInfo
                    this.setData({
                        userInfo: res.userInfo,
                        hasUserInfo: true
                    })
                }
            })
        }
        var _this = this,
            _game = {
                wxthis: _this,
                RN: 4, //总行数
                CN: 4, //总列数
                data: [], //保存游戏格子数据的二位数组
                score: 0, //保存游戏得分
                FScore: 0,
                state: 1, //保存游戏状态
                GAMEOVER: 0, //表示游戏结束状态
                RUNNING: 1, //表示游戏运行中
                top: 0, //保存游戏最高分             
                _start: function (wx) { //游戏启动
                    //获得cookie中的top变量值，保存在top属性中（如果top变量的值无效，就用0代替）
                    this.top = _this._getCookie("top") || 0;
                    //重置游戏状态为RUNNING
                    this.state = this.RUNNING;
                    this.score = 0; //重置分数为0
                    //创建空数组保存在data属性中
                    this.data = [];
                    //r从0开始到小于RN结束
                    for (var r = 0; r < this.RN; r++) {
                        //创建一个空数组保存在data中r行
                        this.data[r] = [];
                        for (var c = 0; //c从0开始，到＜CN结束
                            c < this.CN; //设置data中r行c列的值为0
                            this.data[r][c] = 0, c++);
                    }
                    //在二位数组中生成两个随机数：
                    this._randomNum();
                    this._randomNum();
                    this._updateToPage(); //更新页面
                },
                _updateToPage: function () {
                    //如果游戏状态为结束
                    if (this.state == this.GAMEOVER) {
                        //找到id为gameOver的元素，设置其显示
                        this.wxthis.setData({
                            gameOver: true
                        })
                    }
                    //否则
                    else {
                        // 找到id为gameOver的元素，这是其隐藏
                        this.wxthis.setData({
                            gameOver: false
                        })
                    }
                },
                _move: function (callback) {
                    //将data转为String，保存在before中
                    var before = String(this.data);
                    callback();
                    //将data转为String，保存在after中
                    var after = String(this.data);
                    //如果before不等于阿after
                    if (before != after) {
                        this._randomNum(); //随机生成一个数		
                        //如果游戏结束
                        if (this._isGameOver()) {
                            //修改游戏状态为GAMEOVER
                            this.state = this.GAMEOVER;
                            //如果score＞top
                            if (this.score > this.top) {
                                //当前时间
                                // var now = new Date();
                                // //将now+1年
                                // now.setFullYear(now.getFullYear() + 1);
                                //才将score写入cookie中top变量中，设置过期日期为now
                                _this._setCookie("top", this.score);
                            }
                        }
                        this._updateToPage(); //更新页面
                    }
                },
                _isGameOver: function () {
                    //遍历data中每个元素
                    for (var r = 0; r < this.RN; r++) {
                        for (var c = 0; c < this.CN; c++) {
                            //如果当前元素是0，就返回false
                            if (this.data[r][c] == 0) {
                                return false;
                            }
                            //否则，如果c<CN-1&&当前元素等于右侧元素
                            else if (c < this.CN - 1 &&
                                this.data[r][c] == this.data[r][c + 1]) {
                                return false; //就返回false
                            } else if (r < this.RN - 1 &&
                                this.data[r][c] == this.data[r + 1][c]) {
                                //否则，如果r<RN-1&&当前元素等于下方元素
                                return false; //就返回false
                            }
                        }
                    } //(遍历结束)
                    return true; //返回true
                },
                _moveLeft: function () {
                    console.log(this.data)
                    this._move(function () {
                        //遍历data中每一行
                        for (var r = 0; r < this.RN; r++) {
                            this._moveLeftInRow(r); //调用_moveLeftInRow方法，传入r
                        }
                    }.bind(this)); //moveDonw中的this
                },
                _moveLeftInRow: function (r) { //左移第r行
                    //c从0开始到＜CN-1结束
                    for (var c = 0; c < this.CN - 1; c++) {
                        //调用_getNextInRow方法，传入参数r，c，将返回值保存在next中
                        var nextc = this._getNextInRow(r, c);
                        //如果nextc是-1，退出循环
                        if (nextc == -1) {
                            break;
                        }
                        //否则
                        else {
                            //如果c位置的值是0
                            if (this.data[r][c] == 0) {
                                //就将第r行的c位置的值替换为nextc位置的值
                                this.data[r][c] = this.data[r][nextc];
                                //将nextc位置的值置为0
                                this.data[r][nextc] = 0;
                                //c留在原地
                                c--;
                            } else if (this.data[r][c] == this.data[r][nextc]) {
                                //如果r行c位置的值等于r行nextc位置的值
                                this.data[r][c] *= 2; //将r行c位置的值*2	
                                //将r行c列的新值累加到score属性上
                                this.score += this.data[r][c];
                                this.data[r][nextc] = 0; //将nextc位置的值置为0					
                            }
                        }
                    }
                },
                _getNextInRow: function (r, c) {
                    //nextc从c+1开始，c＜CN结束
                    c++;
                    //var nextc=c+1;
                    for (; c < this.CN; c++) {
                        //如果r行c位置不是0
                        if (this.data[r][c] != 0) {
                            //返回c
                            return c;
                        } //遍历结束
                    }
                    return -1; //返回 -1 （没找到）
                },
                _moveRight: function () {
                    this._move(function () {
                        //遍历data中每一行
                        for (var r = 0; r < this.RN; r++) {
                            this._moveRightInRow(r); //调用_moveRightInRow方法，传入r
                        }
                    }.bind(this));
                },
                _moveRightInRow: function (r) { //左移第r行
                    //c从0开始到＜CN-1结束
                    for (var c = this.CN - 1; c > 0; c--) {
                        //调用_getPrevInRow方法，传入参数r，c，将返回值保存在prevc中
                        var prevc = this._getPrevInRow(r, c);
                        //如果prevc是-1，退出循环
                        if (prevc == -1) {
                            break;
                        }
                        //否则
                        else {
                            //如果c位置的值是0
                            if (this.data[r][c] == 0) {
                                //就将第r行的c位置的值替换为prevc位置的值
                                this.data[r][c] = this.data[r][prevc];
                                //将prevc位置的值置为0
                                this.data[r][prevc] = 0;
                                //c留在原地
                                c++;
                            } else if (this.data[r][c] == this.data[r][prevc]) {
                                //如果r行c位置的值等于r行prevc位置的值
                                this.data[r][c] *= 2; //将r行c位置的值*2					
                                //将r行c列的新值累加到score属性上
                                this.score += this.data[r][c];
                                this.data[r][prevc] = 0; //将prevc位置的值置为0					
                            }
                        }
                    }
                },
                _getPrevInRow: function (r, c) {
                    //nextc从c--开始，c>=0结束
                    c--;
                    for (; c >= 0; c--) {
                        if (this.data[r][c] != 0) {
                            return c;
                        }
                    }
                    return -1; //返回 -1 （没找到）
                },
                _moveUp: function () {
                    this._move(function () {
                        //遍历data中每一列
                        for (var c = 0; c < this.CN; c++) {
                            this._moveUpInCol(c); //调用_moveUpInCol上移第c列
                        }
                    }.bind(this));
                },
                _moveUpInCol: function (c) {
                    //r从0开始,到r<RN-1结束，r每次递增1
                    for (var r = 0; r < this.RN - 1; r++) {
                        //查找r行c列下方下一个不为0的位置nextr
                        var nextr = this._getNextInCol(r, c);
                        //如果没找到,就退出循环
                        if (nextr == -1) {
                            break;
                        }
                        //否则  
                        else {
                            //如果r位置c列的值为0
                            if (this.data[r][c] == 0) {
                                //将nextr位置c列的值赋值给r位置
                                this.data[r][c] = this.data[nextr][c];
                                //将nextr位置c列置为0
                                this.data[nextr][c] = 0;
                                //r留在原地
                                r--;
                            }
                            //否则，如果r位置c列的值等于nextr位置的值
                            else if (this.data[r][c] == this.data[nextr][c]) {
                                this.data[r][c] *= 2; //将r位置c列的值*2
                                //将r行c列的新值累加到score属性上
                                this.score += this.data[r][c];
                                this.data[nextr][c] = 0; //将nextr位置c列的值置为0
                            }
                        }
                    }
                },
                _getNextInCol: function (r, c) {
                    //r+1
                    r++;
                    //循环，到<RN结束，r每次递增1
                    for (; r < this.RN; r++) {
                        //如果r位置c列不等于0
                        if (this.data[r][c] != 0) {
                            return r;
                        }
                        //返回r
                    } //(遍历结束)
                    return -1; //返回-1
                },
                _moveDown: function () {
                    this._move(function () {
                        //遍历data中每一列
                        for (var c = 0; c < this.CN; c++) {
                            this._moveDownInCol(c); //调用_moveDownInCol下移第c列
                        }
                    }.bind(this));
                },
                _moveDownInCol: function (c) {
                    //r从RN-1开始，到r>0结束，r每次递减1
                    for (var r = this.RN - 1; r > 0; r--) {
                        //查找r位置c列上方前一个不为0的位置prevr
                        var prevr = this._getPrevInCol(r, c);
                        //如果没找到,就退出循环
                        if (prevr == -1) {
                            break;
                        }
                        //否则  
                        else {
                            //如果r位置c列的值为0
                            if (this.data[r][c] == 0) {
                                //将prevr位置c列的值赋值给r位置
                                this.data[r][c] = this.data[prevr][c];
                                //将prevr位置c列置为0
                                this.data[prevr][c] = 0;
                                //r留在原地
                                r++;
                            }
                            //否则，如果r位置c列的值等于prevr位置的值
                            else if (this.data[r][c] == this.data[prevr][c]) {
                                this.data[r][c] *= 2; //将r位置c列的值*2
                                //将r行c列的新值累加到score属性上
                                this.score += this.data[r][c];
                                this.data[prevr][c] = 0; //将prevr位置c列置为0
                            }
                        }
                    }
                },
                _getPrevInCol: function (r, c) {
                    //r-1
                    r--;
                    //循环，r到>=0结束，每次递减1
                    for (; r >= 0; r--) {
                        //如果r位置c列不等于0
                        if (this.data[r][c] != 0) {
                            return r
                        }; //返回r
                    } //(遍历结束)
                    return -1; //返回-1
                },
                _randomNum: function () { //在一个随机位置生成一个2或4
                    //反复：
                    while (1) {
                        //在0~RN-1之间生成一个随机整数r
                        var r = Math.floor(Math.random() * (this.RN));
                        //在0~CN-1之间生成一个随机整数c
                        var c = Math.floor(Math.random() * (this.CN));
                        //如果data中r行c列的值是0
                        if (this.data[r][c] == 0) {
                            //设置data中r行c列的值为：
                            this.data[r][c] = Math.random() < 0.5 ? 2 : 4;
                            //随机生成一个0~1的小数，如果＜0.5，就赋值为2，否则赋值为4
                            break; //退出循环
                        }
                    }
                }

            }
        app.globalData.game = _game;
        app.globalData.game._start();
        this.setData({
            game: _game
        });
    },
    getUserInfo: function (e) {
        console.log(e)
        app.globalData.userInfo = e.detail.userInfo
        this.setData({
            userInfo: e.detail.userInfo,
            hasUserInfo: true
        })
    },
    _getCookie: function (cookieName) {
        return wx.getStorageSync(cookieName) || '';
    },
    _setCookie: function (cookieName, vlaue) {
        wx.setStorageSync(cookieName, vlaue)
    },
    handletouchmove: function (event) {},
    handletouchstart: function (event) {
        this.setData({
            lastX: event.touches[0].pageX,
            lastY: event.touches[0].pageY
        })
    },
    handletouchend: function (event) {
        var currentX = event.changedTouches[0].pageX,
            currentY = event.changedTouches[0].pageY,
            tx = currentX - this.data.lastX,
            ty = currentY - this.data.lastY;
        if (Math.abs(tx) > Math.abs(ty)) {
            if (tx < 0) {

                app.globalData.game._moveLeft();
            } else {
                app.globalData.game._moveRight();
            }
        } else {
            if (ty < 0) {
                app.globalData.game._moveUp();
            } else {
                app.globalData.game._moveDown();
            }
        }

        this.setData({
            lastX: currentX,
            lastY: currentY,
            game: app.globalData.game,
            currentGesture: 0
        })
    },
    gamerestart: function () {        
        app.globalData.game._start();
        this.setData({
            game: app.globalData.game
        });
    }
})